// 先记录所有为 0 的元素位置，再遍历这些位置对应的整行整列，将其设为 0。

// step 1# 将矩阵中所有含 0 的行和列设为 0
void setZeroes(int** matrix, int matrixSize, int* matrixColSize) {
    // step 2# 预定义两个数组，用于记录所有为 0 的位置（行列坐标）
    int size = matrixSize * (*matrixColSize);  // 最坏情况下所有元素为 0，需要 size 个位置
    int x[size];  // 存放行为 0 的元素的行索引
    int y[size];  // 存放为 0 的元素的列索引
    int count = 0;  // 记录 0 的总数

    // step 3# 遍历矩阵，记录所有为 0 的元素的行列位置
    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < *matrixColSize; j++) {
            if (matrix[i][j] == 0) {     // 找到为 0 的位置
                x[count] = i;            // 记录所在行
                y[count] = j;            // 记录所在列
                count++;                 // 累计出现 0 的次数
            }
        }
    }

    // step 4# 遍历记录的所有 0 的位置，依次将对应行和列设为 0
    for (int num = 0; num < count; num++) {
        int curX = x[num];  // 当前为 0 元素所在行
        int curY = y[num];  // 当前为 0 元素所在列

        // step 5# 将当前列设为 0
        for (int i = 0; i < matrixSize; i++) {
            matrix[i][curY] = 0;  // 整列清零
        }

        // step 6# 将当前行设为 0
        for (int j = 0; j < *matrixColSize; j++) {
            matrix[curX][j] = 0;  // 整行清零
        }
    }
}
